package netty.bytebuf;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.util.CharsetUtil;
import org.junit.Test;

import java.nio.Buffer;

/**
 * @Auther: luobiao
 * @Date: 2020/9/20 17:49
 * @Description:
 */
public class ByteBufTest {
    /**
     * Unpooled 测试
     * ByteBuf中维护了两个不同的索引：一个用于读取，一个用于写入
     * ByteBuf#writeXXX 和 ByteBuf#readXXX 会修改索引的位置，ByteBuf#setXXX 和 ByteBuf#getXXX 不会索引的位置
     */
    @Test
    public void test1(){
        //通过非池化资源工具类Unpooled分配一个ByteBuf，默认初始容量为256，最大容量为Integer.MAX_VALUE
        ByteBuf buf=Unpooled.buffer();
        print1("初始化后-->", buf);
        buf.writeInt(10); //一个int是4个字节
        print1("写入int 10-->", buf);
        buf.writeInt(11);
        print1("写入int 11-->", buf);
        buf.readInt();
        print1("读第一个int-->", buf);
        buf.readInt();
        print1("再读取一个int-->", buf);
        buf.writeInt(12);
        print1("写入int 13-->", buf);
        buf.setInt(12, 14);
        print1("从下标12开始修成14-->", buf);
    }

    /**
     * 派生缓冲区
     */
    @Test
    public void test2(){
        ByteBuf buf = Unpooled.copiedBuffer("hello", CharsetUtil.UTF_8);
        print2("初始化后-->",buf);
        ByteBuf bufCopy = buf.slice(0,3);//复制的片拥有自己独立的索引位置，但内部存储的数组是共享的
        print2("复制的bufCopy为 -->",bufCopy);
        buf.setByte(0, 'a'); //一个char=2 byte,所以此处用setByte
        print2("修改原ByteBuf后复制的bufCopy为 -->",bufCopy);
    }

    /**
     * ByteBuff复制
     */
    @Test
    public void test3(){
        ByteBuf buf = Unpooled.copiedBuffer("hello", CharsetUtil.UTF_8);
        print2("初始化后-->",buf);
        ByteBuf bufCopy = buf.copy(0,3);//通过copy方法复制的片拥有自己独立的索引位置和数组
        print2("复制的bufCopy为 -->",bufCopy);
        buf.setByte(0, 'a'); //一个char=2 byte,所以此处用setByte
        print2("修改原ByteBuf后复制的bufCopy为 -->",bufCopy);
    }


    private void print1(String name,ByteBuf byteBuf) {
        System.out.println(name+"--->readIndex = "+byteBuf.readerIndex()+"; "+"writeInde = "+byteBuf.writerIndex()+"; "+"capacity = "+byteBuf.capacity()+"; ");
    }

    private void print2(String name,ByteBuf byteBuf) {
        System.out.println(name+"--->readIndex = "+byteBuf.readerIndex()+"; "+"writeInde = "+byteBuf.writerIndex()+"; "+"capacity = "+byteBuf.toString(CharsetUtil.UTF_8)+"; ");
    }
}
